perm filename SEG1.SAI[SYS,HE]1 blob sn#016518 filedate 1972-12-06 generic text, type T, neo UTF8
COMMENT ⊗   VALID 00012 PAGES 
RECORD PAGE   DESCRIPTION
 00001 00001
 00002 00002	ENTRY DUMMY
 00003 00003	α	LPAIRS
 00006 00004	α	DISJOINT
 00007 00005	α	FIXUP 1
 00009 00006	α	FIXUP 2
 00012 00007	α	TRY0
 00014 00008	α	TRY1
 00016 00009	α	TRY2
 00017 00010	α	TRY4
 00023 00011	α	TRY5
 00025 00012	α	SPLICE
 00027 ENDMK
⊗;
ENTRY DUMMY;

BEGIN "SEG1"

REQUIRE		100			PNAMES;
REQUIRE		100			NEW_ITEMS;
REQUIRE		"PREAMB.SAI[SYS,HE]"	SOURCE_FILE;
REQUIRE		"SYMBOL.AUX[H,RPO]"	SOURCE_FILE;
REQUIRE		"SEGCOM.AUX[SYS,HE]"	SOURCE_FILE;
REQUIRE		"SEGDPY.HDR[SYS,HE]"	SOURCE_FILE;

DEFINE
	MERGE(N)=<MERGED[N]←MERGED[N]+1>;

α	EXTERNAL PROCEDURES;

EBP	COLINEAR(ITEMVAR L1,L2);
ERP	DIST(SAFE REAL ARRAY ITEMVAR V1,V2);
EP	MERGE_NODE(SET ITEMVAR Y,X);
EBP	VERT(ITEMVAR E);
EBP	PARALLEL(ITEMVAR L1,L2);
ESP	PRINTNAME(ITEMVAR X);

α	LPAIRS
look for matched BADL's and set up a node called LPAIR
whose ∂ is the two colinear lines.
[NOTE: this creates a node for each of the BADL vertices.]

Quite obviously, this is not the right thing to do...a line
between the BADLs should be created and added to the created
nodes.
;

INTERNAL PROCEDURE LPAIRS;
BEGIN "LPAIRS"
      ∀ R|REGION⊗S≡R DO
       ∀ P1|CORNER⊗R≡P1 ∧ FLAVOR⊗P1≡BADL DO
	∀ P2|	CORNER⊗R≡P2 ∧ FLAVOR⊗P2≡BADL ∧ (P1≠P2) ∧
	 (¬(LPAIR⊗P2≡P1)) ∧ (ENDPT`P2∩ENDPT`P1=PHI) DO
	  BEGIN "LPAIR1"
	     S2←ENDPT`P1;
	     L1←LOP(S2);
	     L2←COP(S2);
	     S2←ENDPT`P2;
	     L3←LOP(S2);
	     L4←COP(S2);
	     BOOL←FALSE;
	     IF COLINEAR(L1,L3)
	      THEN S2←{L1,L3}
	       ELSE IF COLINEAR(L1,L4)
		THEN S2←{L1,L4}
		 ELSE IF COLINEAR(L2,L3)
		  THEN S2←{L2,L3}
		   ELSE IF COLINEAR(L2,L4)
		    THEN S2←{L2,L4}
		     ELSE BOOL←TRUE;
	     IF ¬BOOL
	      THEN BEGIN "DO LPAIR"
		 DPYINFO("LPAIR: "&PRINTNAME(P1)&" "&PRINTNAME(P2));
		 MAKE LPAIR⊗P1≡P2;
		 SIV←NEW(PHI);
		 ∂(SIV)←S2;
α		 XX←NEW(SIZE7):	NEW_PNAME(XX,"P"&CVS(∂(NEWP)←∂(NEWP)+1));
α		 ∂(XX)[6]←∂(P1)[6];
α		 ∂(XX)[7]←∂(P1)[7];
		 MAKE NMATCH⊗SIV≡P1;
		 MAKE NODE⊗GRAPH≡SIV;
		 MAKE NFLAVOR⊗SIV≡LPAIR;
		 DPYBRK;
	      END "DO LPAIR";
	  END "LPAIR1";
END "LPAIRS";

α	DISJOINT
merge disjoint nodes that each contain a TJOINT,
where the TJOINTs have colinear TSTEMs;

INTERNAL PROCEDURE DISJOINT;
BEGIN "DISJOINT"
	∀ U,V|UεTSTEMS ∧ VεTSTEMS ∧ (U≠V) DO
	 IF COLINEAR(U,V)
	 THEN ∀ X,Y|NODE⊗GRAPH≡X ∧ NODE⊗GRAPH≡Y ∧ (X≠Y) DO
	  IF (Uε∂(X) ∧ Vε∂(Y)) ∨ (Uε∂(Y) ∧ Vε∂(X))
	  THEN BEGIN "MERGE DISJOINTS"
		DPYBOOL←TRUE;
		MERGE_NODE(Y,X);
		MERGE(1);
		TYPE "MERGING 2 CLUMPS BECAUSE OF "&
		 PRINTNAME(U)&" AND "&PRINTNAME(V) EOM;
		REMOVE U FROM TSTEMS;
		REMOVE V FROM TSTEMS;
		END "MERGE DISJOINTS";
	END "DISJOINT";

α	FIXUP 1
for any node of the graph which is a single TJOINT where one
of the colinear portions is also a part of a BADL and the other line
of the BADL belongs to some other node of the graph, merge the TJOINT
node with this node;

INTERNAL PROCEDURE FIXUP1;
BEGIN "FIXUP1"
      ∀ X|NODE⊗GRAPH≡X ∧ NFLAVOR⊗X≡TJOINT DO
       IF LENGTH(∂(X))=2
	THEN BEGIN "T AND L"
	   LABEL OUT1;
	   S2←∂(X);
	   L1←LOP(S2);
	   L2←COP(S2);
	   ASSIGN P|NMATCH⊗X≡P HOLDS;
	   S2←ENDPT⊗L1∪ENDPT⊗L2;
	   REMOVE P FROM S2;
	   ∀ P|PεS2 ∧ FLAVOR⊗P≡BADL DO
	    ∀ Y| NODE⊗GRAPH≡Y DO
	     IF ENDPT`P∩∂(Y)≠PHI
	      THEN BEGIN "DO FIX1"
		 DPYBOOL←TRUE;
		 MERGE_NODE(X,Y);
		 merge(2);
		 GO TO OUT1;
		 END "DO FIX1";
	OUT1:
	END "T AND L";
	END "FIXUP1";

α	FIXUP 2
this case handles a dangling GOODL that would otherwise be
discarded if both edges of the GOODL are also stems of TJOINTs;

INTERNAL PROCEDURE FIXUP2;
BEGIN "FIXUP2"
	∀ X|NODE⊗GRAPH≡X ∧ NFLAVOR⊗X≡GOODL DO
       IF LENGTH(∂(X))=2
	THEN BEGIN "D GOODL"
	   LABEL OUT4;
	   ASSIGN P|NMATCH⊗X≡P HOLDS;
	   S2←ENDPT`P;
	   IF ¬S2≤TSTEMS THEN GO TO OUT4;
	   L1←LOP(S2);
	   L2←COP(S2);
	   S3←ENDPT⊗L1∪ENDPT⊗L2;
	   REMOVE P FROM S3;
	   P1←LOP(S3);
	   P2←COP(S3);
	   IF FLAVOR⊗P1≡TJOINT ∧ FLAVOR⊗P2≡TJOINT
	    THEN BEGIN "DG2"
	       ASSIGN R|BOUNDARY⊗R≡L1 ∧ BOUNDARY⊗R≡L2 ∧ (R≠BACK) HOLDS;
	       ∀ LX|LXε{L1,L2} DO
		BEGIN "DG3"
		   PX←COP(ENDPT⊗LX-{P});
		   ASSIGN L|ENDPT⊗L≡PX ∧ (L≠LX) ∧ (BOUNDARY⊗R≡L) HOLDS;
		   S3←ENDPT⊗L;
		   P3←LOP(S3);
		   P4←COP(S3);
		   IF FLAVOR⊗P3≡TJOINT ∧ FLAVOR⊗P4≡TJOINT
		    THEN BEGIN "DG4"
		       IF P3ε{P1,P2} THEN P5←P4 ELSE P5←P3;
		       ASSIGN L1|ENDPT⊗L1≡P5 ∧ (L1≠L) ∧ BOUNDARY⊗R≡L1 HOLDS;
		       ∀  Y|NODE⊗GRAPH≡Y DO
			IF L1ε∂(Y)
			 THEN BEGIN "DG5"
			    ∂(Y)←∂(Y)∪ENDPT`P;
			    S1←S1∪S2;
			    merge(3);
			    DPYBOOL←TRUE;
			    MERGE_NODE(X,Y);
			    GO TO OUT4;
			 END "DG5";
		    END "DG4";
		END "DG3"
	    END "DG2";
	OUT4:
	END "D GOODL";
	END "FIXUP2";
α	TRY0
if two connected BADLs belong to the same node, the line
between them isn't.  Therefore include it.
Further, if two connected BADLs don't belong to the same
node, the line between them should be put in one node or
the other...
       p0 o----------o-----------o p2
		    p1

	p0	p1	p2		result

	ARROW	BADL	BADL		p0 gets both arms
	ARROW	BADL	GOODL		p0 gets 1/2, p2 gets 1/2

	GOODY	BADL	-		p0 gets both
	GOODY	BADL	BADL		p0 gets 1/2, p2 gets 1/2

	GOODL	BADL	GOODL		p0 gets 1/2, p2 gets 1/2

	BADL	BADL	BADL		p0 gets both

;

INTERNAL PROCEDURE TRY0;
BEGIN "TRY0"
ITEMVAR L,LA,LB,VA,VB;
SET S2;
SET ITEMVAR X;

∀ L|LINE⊗S≡L ∧ (¬(LεS1)) DO
BEGIN "LEFTOUT"
  S2←ENDPT⊗L;
  VA←LOP(S2);
  VB←COP(S2);
  IF FLAVOR⊗VA≡BADL ∧ FLAVOR⊗VB≡BADL
  THEN BEGIN "WANTED"
	S2←ENDPT`VA-{L};
	LA←COP(S2);
	S2←ENDPT`VB-{L};
	LB←COP(S2);
	∀ X|NODE⊗GRAPH≡X DO
	IF LAε∂(X) ∧ LBε∂(X)
	THEN BEGIN "HERE"
		TYPE "TRY0 - UNACCOUNTED LINE "&PRINTNAME(L)&
		" PUT IN NODE." EOM;
		PUT L IN ∂(X);
		END "HERE";
	END "WANTED";
  END "LEFTOUT";
END "TRY0";

α	TRY1
THE SET "S1" CONTAINS ALL THE LINES CONTAINED AS NODE DATUMS.
THE SET "S2" IS A TEMPORARY SET USED IN LINE MANIPULATION.

this is concerned with the lines of the scene which
are not accounted for by the graph node ∂s...if the line
is between TJOINTs or BADAROs or combos of these, then find
the first graph node having a line colinear with this line
and put the line into that node;

INTERNAL SUBR TRY1;
      ∀ R,L|REGION⊗S≡R ∧ BOUNDARY⊗R≡L ∧ (¬LεS1) DO
       BEGIN "TRY 1"
	  LABEL OUT2;
	  S2←ENDPT⊗L;
	  P1←LOP(S2);
	  P2←COP(S2);
	  IF (FLAVOR⊗P1≡TJOINT ∨ FLAVOR⊗P1≡BADARO) ∧
	   (FLAVOR⊗P2≡TJOINT ∨ FLAVOR⊗P2≡BADARO)
	    THEN BEGIN
	       S2←BOUNDARY⊗R;
	       REMOVE L FROM S2;
	       ∀ L1|L1εS2 DO
		IF COLINEAR(L,L1)
		 THEN ∀ X|NODE⊗GRAPH≡X DO
		  IF L1ε∂(X)
		   THEN BEGIN
		      ∂(X) ← ∂(X)∪{L};
		     TYPE "TRY 1 - LINE "&PRINTNAME(L)&" OF REGION "&
				PRINTNAME(R)&" ADDED TO NODE" EOM;
		      PUT L IN S1;
		      GO TO OUT2;
		   END;
	    END;
       OUT2:
       END "TRY 1";
α	TRY2
if some of the lines of a non-background regions are
contained in any node, then add the rest of the
region's lines to that node.
;

INTERNAL SUBR TRY2;
∀ R|REGION⊗S≡R ∧ (R≠BACK) DO
       BEGIN	"TRY 2"
	  LABEL LABA;
	  S3←BOUNDARY⊗R;
	  S2←BOUNDARY⊗R∩S1;
	  IF LENGTH(S2)=0 ∨ (S2=S3)
	  THEN GO TO LABA;
	  ∀ X| NODE⊗GRAPH≡X DO
	   IF S2<∂(X)
	    THEN BEGIN
	       ∀ L|BOUNDARY⊗R≡L DO
		BEGIN
		   TYPE "TRY 2 - LINE "&PRINTNAME(L)&" OF REGION "&
			PRINTNAME(R)&" ADDED." EOM;
		   ∂(X)←∂(X)∪{L};
		   PUT L IN S1;
		END;
	       DONE;
	    END;
       LABA:
       END "TRY 2";


α	TRY4
DOUBLE is the set of lines that were duplicated at XJOINTs and KJOINTs
assign the regions of the scene to bodies;

INTERNAL SUBR TRY4;
BEGIN "TRY4"

      ∀ R|REGION⊗S≡R ∧ (R≠BACK) DO
       BEGIN "TRY 41"
	  LABEL NEXTR;
IF DEBUG2
THEN BEGIN
	HYDPOG(BPOG);
	DPYSET(DPYAA);
	DPYBRT(BRIGHT);
	∀ L|BOUNDARY⊗R≡L DO DPYL(L);
	DPYOUT(APOG);
	END;
α region assigned by BOUNDARY argument;
	  S2←BOUNDARY⊗R∩S1-DOUBLE;
	  ∀ B|BODY⊗S≡B DO
	   IF S2<LINE⊗B
	    THEN BEGIN
	       MAKE FACE⊗B≡R;
		DPYLAB("GOBBLED BY "&PRINTNAME(B));
	       GO TO NEXTR;
	    END;
α region assigned by CORNER argument;
	  S2←CORNER⊗R;
	  ∀ B|BODY⊗S≡B DO
	   IF S2<POINT⊗B
	    THEN BEGIN
	       MAKE FACE⊗B≡R;
		DPYLAB("GOBBLED BY "&PRINTNAME(B));
	       GO TO NEXTR;
	    END;
α leftover region to be considered;
	  TYPE "LEFTOVER "&PRINTNAME(R) EOM;
	  BBADLCNT←0;
	  BB1←BB2←NIL;
	  ∀ X|CORNER⊗R≡X DO
α if a CORNER of the region is BADL and the lines forming the point are all
contained in the datums of the nodes...;
	   IF FLAVOR⊗X≡BADL ∧ ENDPT`X<S1
	    THEN BEGIN "BADL"
	       SX←ENDPT`X;
α ...get the two lines of the BADL...;
	       L1←LOP(SX);
	       L2←COP(SX);
α ...pickup the two bodies that contain the two lines that make the BADL...;
	       ASSIGN B1|LINE⊗B1≡L1 ∧ (B1≠S) HOLDS;
	       ASSIGN B2|LINE⊗B2≡L2 ∧ (B2≠S) HOLDS;
	       TYPE "TRY4 - (BADL "&PRINTNAME(X)&")"&
		PRINTNAME(B1)&" "&PRINTNAME(B2)&
		" "&PRINTNAME(BB1)&" "&PRINTNAME(BB2) EOM;
α ...distinct bodies not seen before ??...;
	       IF B1≠B2 ∧ {B1,B2}≠{BB1,BB2}
		THEN BEGIN "ADD 1"
		   BB1←B1;
		   BB2←B2;
		   BBADLCNT←BBADLCNT+1;
		END "ADD 1";
	    END "BADL";
	  IF BBADLCNT=0
α ...look at each region boundary that belongs to a node...;
	   THEN ∀ L|BOUNDARY⊗R≡L ∧ LεS1 DO
α ...there weren't any BADL corners for this bodyless region...;
	    IF LεTSTEMS
	     THEN BEGIN "TSTEMS"
		LABEL NEXTL;
		SX←ENDPT⊗L;
		P1←LOP(SX);
		P2←COP(SX);
		IF FLAVOR⊗P1≡BADL ∨ FLAVOR⊗P2≡BADL
		 THEN GO TO NEXTL;
		ASSIGN B|BODY⊗S≡B ∧ LINE⊗B≡L HOLDS;
		MAKE FACE⊗B≡R;
		DPYLAB("GOBBLED BY "&PRINTNAME(B));
		GO TO NEXTR;
	     NEXTL:
	     END "TSTEMS";
	  ∀ C|CORNER⊗R≡C ∧ FLAVOR⊗C≡BADY ∧ (LENGTH(ENDPT`C∩S1)=3) DO
	   BEGIN "BADY"
	      L1←NIL;
	      ∀ L|ENDPT⊗L≡C DO
	       BEGIN
		  SX←ENDPT`C-{L};
		  ∀ B|BODY⊗S≡B DO
		   IF SX<LINE⊗B THEN L1←L;
	       END;
	      IF L1=NIL
	       THEN BEGIN
		  TYPE "TRY4 - BADY REGION ASSIGNMENT ERROR." EOM;
		  RETURN;
	       END;
	      ASSIGN B|LINE⊗B≡L ∧ (B≠S) HOLDS;
		DPYLAB("GOBBLED BY "&PRINTNAME(B));
	      MAKE FACE⊗B≡R;
	      GO TO NEXTR;
	   END "BADY";

	  IF BBADLCNT=1
	   THEN BEGIN "BADL 1"
	      STR←PRINTNAME(R)&"bad1";
	      R1←NEW; NEW_PNAME(R1,STR);
	      STR←PRINTNAME(R)&"bad2";
	      R2←NEW; NEW_PNAME(R2,STR);
α the first AND ONLY instance of PARENT in the SEGMENTER -
an association between REGIONs;
	      MAKE PARENT⊗R2≡R;
	      MAKE PARENT⊗R1≡R;
	      MAKE FACE⊗BB1≡R1;
	      MAKE FACE⊗BB2≡R2;
α ,,,this bit of code assigns the wrong line to a
newly created region...must be more selective...;
	      ∀ L|BOUNDARY⊗R≡L DO
	       BEGIN
		  MAKE BOUNDARY⊗R1≡L;
		  MAKE BOUNDARY⊗R2≡L;
	       END;
	      ∀ P|CORNER⊗R≡P DO
	       BEGIN
		  MAKE CORNER⊗R1≡P;
		  MAKE CORNER⊗R2≡P;
	       END;
α these next two statements will prohibit backup !!;
α	      ERASE BOUNDARY⊗R≡ANY;
α	      ERASE CORNER⊗R≡ANY;
	      GO TO NEXTR;
	   END "BADL 1";

	  IF BBADLCNT>1 THEN TYPE "TRY4 - MORE THAN 1 BAD BADL!" EOM;

       NEXTR:
	HYDPOG(APOG);
       END "TRY 41";
END "TRY4";

α	TRY5
This looks like it tries to remove the lines
between bad vertices from a region.
;

INTERNAL SUBR TRY5;
      ∀ B,F|BODY⊗S≡B ∧ FACE⊗B≡F DO
       BEGIN "TRY 5"
	STR←PRINTNAME(F);
	IF EQU(STR[∞-3 TO ∞-1],"bad")
	THEN BEGIN "T5"
		S2←BOUNDARY⊗F ∩ LINE⊗B;
		∀ L|LεS2 DO
		BEGIN "T51"
		  BOOL←FALSE;
		  SX←ENDPT⊗L;
		  P1←LOP(SX);
		  P2←COP(SX);
		  IF ((FLAVOR⊗P1≡BADL ∧ FLAVOR⊗P2≡BADL) ∨
		   (FLAVOR⊗P1≡BADL ∧ FLAVOR⊗P2≡TJOINT) ∨
		    (FLAVOR⊗P1≡TJOINT ∧ FLAVOR⊗P2≡BADL) ∨
		     (FLAVOR⊗P1≡BADL ∧ FLAVOR⊗P2≡BADARO) ∨
		      (FLAVOR⊗P1≡BADARO ∧ FLAVOR⊗P2≡BADL))
		       THEN BOOL←TRUE;
		  END "T51";
		IF BOOL
		THEN BEGIN "T52"
		  DPYBOOL←TRUE;
		  TYPE "TRY5 - LINE "&PRINTNAME(L)&
		   " SHOULDN'T BE IN REGION "&PRINTNAME(F) EOM;
		  ERASE BOUNDARY⊗F≡L;
		  IF LENGTH(ENDPT`P1 ∩ S2)=1 THEN ERASE CORNER⊗F≡P1;
		  IF LENGTH(ENDPT`P2 ∩ S2)=1 THEN ERASE CORNER⊗F≡P2;
		  IF LENGTH(ENDPT`P1)=1 THEN ERASE POINT⊗B≡P1;
		  IF LENGTH(ENDPT`P2)=1 THEN ERASE POINT⊗B≡P2;
		  ERASE LINE⊗BODY≡L;
		  ERASE ENDPT⊗L≡P1;
		  ERASE ENDPT⊗L≡P2;
		  END "T52";
	   END "T5";
       END "TRY 5";
α	SPLICE
merge colinear touching lines of a body into one line

	O----------O------------O
	     L1	   P	L2      W
;
INTERNAL PROCEDURE SPLICE;
      ∀ B,P|BODY⊗S≡B ∧ POINT⊗B≡P ∧ (LENGTH(LINE⊗B∩ENDPT`P)=2) ∧
       (FLAVOR⊗P≡TJOINT ∨ FLAVOR⊗P≡KJOINT ∨ FLAVOR⊗P≡GOODL)  DO
	BEGIN	"L10"	SET SR;
	   S2←ENDPT`P∩LINE⊗B;
	   L1←LOP(S2);
	   L2←COP(S2);
	   IF COLINEAR(L1,L2)
	     THEN BEGIN
		TYPE "END OF SEGMENTER FINDS 2 COLINEAR LINES AT "&
		 PRINTNAME(P) EOM;
		W←COP(ENDPT⊗L2-{P});
		SR←((BOUNDARY`L2)∩(FACE⊗B))-{BACK};
		∀ R|RεSR DO
		BEGIN	ERASE CORNER⊗R≡P;
			ERASE BOUNDARY⊗R≡L2;
			END;
		ERASE LINE⊗B≡L2;
		ERASE POINT⊗B≡P;
		ERASE ENDPT⊗L2≡P;
		ERASE ENDPT⊗L2≡W;
		ERASE ENDPT⊗L1≡P;
		MAKE ENDPT⊗L1≡W;
		∀ W|OCCLUDER⊗W≡L2 DO
		 BEGIN
		    ERASE OCCLUDER⊗W≡L2;
		    MAKE OCCLUDER⊗W≡L1;
		 END;
α a GOODL may be occluded by some one else;
		∀ W|OCCLUDER⊗L2≡W DO
		 BEGIN
		    ERASE OCCLUDER⊗L2≡W;
		    MAKE OCCLUDER⊗L1≡W;
		 END;
		∀ W|SON⊗L2≡W DO
		 BEGIN
		    ERASE SON⊗L2≡W;
		    MAKE SON⊗L1≡W;
		 END;
		∀ W|SON⊗W≡L2 DO
		 BEGIN
		    ERASE SON⊗W≡L2;
		    MAKE SON⊗W≡L1;
		 END;
α HOW, then, can SON ever be, except between LINEs !!!!!;
		MAKE SON⊗L1≡L2;
	     END;
	END "L10";

END "SEG1";